package com.dek.ssm.ch2.proxy;

import java.lang.reflect.Method;

import org.junit.Test;

import com.dek.ssm.ch2.reflect.ReflectServiceImpl;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

/**
 * JDK 动态代理必须提供接口才能使用 ， 在一些不能提供接口的环境中，只能采用其他
	第三方技术， 比如 CGLIB 动态代理。它的优势在于不需要提供接口，只要一个非抽象类就
	能实现动态代理 
 * @author liuxiaodong
 *
 */
public class CglibProxyExample implements MethodInterceptor {
	
	/**
	 * 生成cglib对象
	 * @param clazz
	 * @return Class 类的 CGLIB 代理对象
	 */
	public Object getProxy(Class clazz) {
		// CGLIB enhancer 增强类对象
		Enhancer enhancer = new Enhancer();
		// 设置增强类型
		enhancer.setSuperclass(clazz);
		// 定义代理逻辑对象为当前对象，要求当前对象实现 Methodinterceptor 方法
		enhancer.setCallback(this);
		// 生成并返回代理对象
		return enhancer.create();
	}
	
	/**
	 * 代理逻辑方法
	 */
	@Override
	public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
		System.out.println("调用真实对象前");
		// CGLIB 反射调用真实对象方法
		Object result = proxy.invokeSuper(obj, args);
		System.out.println("调用真实对象后");
		return result;
	}

	@Test
	public void tesCGLIBProxy() {
		CglibProxyExample cpe = new CglibProxyExample();
		ReflectServiceImpl obj = (ReflectServiceImpl) cpe.getProxy(ReflectServiceImpl.class);
		obj.sayHello("dek");
	}
	
}
